<?php
//establece el uso horario
date_default_timezone_set('Europe/Madrid');
define("SPECIALCONSTANT",true);//para poder utilizar archivos requeridos
require("base/connect.php");
require("base/config.php");
//inicia log
$cad_log="\n"."\n".'---------- Inicio script: '.date('Y-m-d H:i:s')."\n";
// Admin username
$admin = "admin";
$email_error='informatica@semaf.org';
$msg = '';
//conecta a la base de datos----------------------------------------------
try{
	$conn = getConnection();
}catch(PDOException $e){
	if($b_imprimir) print 'No se ha podido conectar al host: '.$e->getMessage()."\n";

	//notifica error por email
	p_NotificarError($email_error,'No se ha podido conectar al host: '.$e->getMessage());

	exit();
}
//obtiene configuracion--------------------------------------------------
if(!getConfigApp($conn,$msg)){
	print $msg."\n";
	print '---------- fin del script ------------'."\n";

	//notifica error por email
	p_NotificarError($email_error,$msg);

	$conn = null;//cierra conexion

	exit();
}

//comprueba que este habilitado el checkeo de usuario y operaciones de Ajaxplorer
if(!CONF_CHECK_USUARIOS || !CONF_OPERACIONES_AJAXPLORER){
	print $cad_log."\n";
	$error='No esta habilitado el chequeo de usuarios'."\n";
	print 'Error: '.$error."\n";
	print '----- fin del script --------------'."\n";
	
	//notifica error por email
	p_NotificarError($email_error,$error);
	
	$conn = null;//cierra conexion
	
	exit();
}
$email_fuendocu=CONF_EMAIL_ADMIN;
$email_error=CONF_EMAIL_ERROR;

//establece tipo caracteres bd
try{
	$q = $conn->prepare("SET NAMES 'utf8'");
	$q->execute();
}catch(PDOException $e){
	print $cad_log."\n";
	$error='No se han podido establecer UTF8: '.$e->getMessage()."\n";
	print 'Error: '.$error."\n";
	print '----- fin del script --------------'."\n";
	
	//notifica error por email
	p_NotificarError($email_error,$error);

	$conn = null;//cierra conexion

	exit();
}

// AjaXplorer API initialization
@ chdir("/var/wwws/core/src");
include_once("base.conf.php");
require_once("plugins/core.log/class.AJXP_Logger.php");
$pServ = AJXP_PluginsService::getInstance();
ConfService::init();
$confPlugin = ConfService::getInstance()->confPluginSoftLoad($pServ);
$pServ->loadPluginsRegistry(AJXP_INSTALL_PATH."/plugins", $confPlugin);
ConfService::start();
$conf = ConfService::getConfStorageImpl();
require_once($conf->getUserClassFileName());
session_name("AjaXplorer");
session_start();

// efectua login como usuario administrador
AuthService::logUser($admin, "", true, false);
$loggedUser = AuthService::getLoggedUser();
if (empty($loggedUser)){
	print '--> El usuario '.$admin.' no tiene permisos en Ajaxplorer'."\n";
	exit();
}else{
	$cad_log.='- '.$admin.' acceso ok'."\n";
}
//activa plugins Ajaxplorer
ConfService::switchRootDir("ajxp_conf");
ConfService::loadRepositoryDriver();
AJXP_PluginsService::getInstance()->initActivePlugins();

//obtiene todos los usuarios
try{
	$q = $conn->prepare("SELECT login,groupPath FROM ajxp_users ORDER BY IdUser");
	$q->execute();
}catch(PDOException $e){
	print $cad_log."\n";
	$error='No se han podido obtener usuarios: '.$e->getMessage()."\n";
	print 'Error: '.$error."\n";
	print '----- fin del script --------------'."\n";
	
	//notifica error por email
	p_NotificarError($email_error,$error);
	
	$conn = null;//cierra conexion
	
	exit();
}
$u_error = array();
$u_blank = array();
$i=0;
$total = $q->rowCount();
//log
$cad_log.='- Numero usuarios '.$total."\n";

//recorre los usuarios
while ($user = $q->fetchObject()){
  	$user_data = action("edit_role", array(
    "role_id" => "AJXP_USR_/{$user->login}",
    "format"  => "json"
  	));
       	if (!$user_data)
    	$u_error[] = "{$user->groupPath}/{$user->login}";
  	elseif
    	(
      	(!property_exists($user_data, "ROLE")) ||
      	(!is_object($user_data->ROLE)) ||
      	(!property_exists($user_data->ROLE, "PARAMETERS")) ||
      	(!is_object($user_data->ROLE->PARAMETERS)) ||
     	(!property_exists($user_data->ROLE->PARAMETERS, "AJXP_REPO_SCOPE_ALL")) ||
      	(!is_object($user_data->ROLE->PARAMETERS->AJXP_REPO_SCOPE_ALL)) ||
      	(!property_exists($user_data->ROLE->PARAMETERS->AJXP_REPO_SCOPE_ALL, "core.conf")) ||
      	(!is_object($user_data->ROLE->PARAMETERS->AJXP_REPO_SCOPE_ALL->{"core.conf"})) ||
      	(!property_exists($user_data->ROLE->PARAMETERS->AJXP_REPO_SCOPE_ALL->{"core.conf"}, "email")) ||
      	(!is_string($user_data->ROLE->PARAMETERS->AJXP_REPO_SCOPE_ALL->{"core.conf"}->email)) ||
      	(strlen($user_data->ROLE->PARAMETERS->AJXP_REPO_SCOPE_ALL->{"core.conf"}->email)==0) ||
      	(!strpos($user_data->ROLE->PARAMETERS->AJXP_REPO_SCOPE_ALL->{"core.conf"}->email, "@"))
    	)
    	
    	$u_blank[] = "{$user->groupPath}/{$user->login}";
}

$cad_log.= "\n";
//muestra usuarios sin email y corruptos
$cad_log.='- Numero usuarios sin email: '.count($u_blank). "\n";
for($i=0;$i<count($u_blank);$i++){
	$cad_log.='. '.$u_blank[$i]. "\n";
	//print '- '.$u_blank[$i]."\n";
}
$cad_log.='- Numero usuarios corruptos: '.count($_error). "\n";
for($i=0;$i<count($u_error);$i++){
	$cad_log.='. '.$u_error[$i]. "\n";
	//print '- '.$u_error[$i]."\n";
}
//corregir usuarios sin email
if(count($u_blank)>0) $cad_log.='----- Usuarios sin email a corregir ------------------'."\n";
for($i=0;$i<count($u_blank);$i++){
	//comprueba si ya esta en la tabla de usuarios que se borran
	$login=explode('/',substr($u_blank[$i],1));
	//print 'login='.$login[1]."\n";
	try{
		$q = $conn->prepare("SELECT * FROM sys_users_del WHERE login = ?");
		$q->bindParam(1,$login[1]);
		$q->execute();
	}catch(PDOException $e){
		print $cad_log."\n";
		$error='No se ha podido obtener usuario desde sys_users_del (1): '.$e->getMessage()."\n";
		print 'Error: '.$error."\n";
		print '----- fin del script --------------'."\n";
		
		//notifica error por email
		p_NotificarError($email_error,$error);
		
		$conn = null;//cierra conexion
		
		exit();
	}
	if($q->rowCount()>0){
		$r = $q->fetchObject();
		//print 'login='.$login[1]."\n";
		if(updateUserData($login[1], false, $r->name, $r->email, $r->phone, $r->residencia, $r->cargo)){
			$cad_log.='- usuario sin email '.$u_blank[$i].' corregido'."\n";
			unset($u_blank);
		}else{
			$cad_log.='- usuario sin email '.$u_blank[$i].' no se ha podido corregir'."\n";
		}
	}
}
//corregir usuarios corruptos
if(count($u_error)>0) $cad_log.='----- Usuarios corruptos a corregir ------------------'."\n";
for($i=0;$i<count($u_error);$i++){
	//comprueba si ya esta en la tabla de usuarios que se borran
	$login=explode('/',substr($u_error[$i],1));
	//print 'login='.$login[1]."\n";
	try{
		$q = $conn->prepare("SELECT * FROM sys_users_del WHERE login = ?");
		$q->bindParam(1,$login[1]);
		$q->execute();
	}catch(PDOException $e){
		print $cad_log."\n";
		$error='No se ha podido obtener usuario desde sys_users_del(2): '.$e->getMessage()."\n";
		print 'Error: '.$error."\n";
		print '----- fin del script --------------'."\n";
		
		//notifica error por email
		p_NotificarError($email_error,$error);
		
		$conn = null;//cierra conexion
		
		exit();
	}
	if($q->rowCount()>0){
		$r = $q->fetchObject();
		//print 'login='.$login[1]."\n";
		if(updateUserData($login[1], false, $r->name, $r->email, $r->phone, $r->residencia, $r->cargo)){
			$cad_log.='- usuario vacio '.$u_error[$i].' corregido'."\n";
			unset($error[$i]);
		}else{
			$cad_log.='- usuario vacio '.$u_error[$i].' no se ha podido corregir'."\n";
		}
	}
}
$conn = null;

//manda email de notificacion
$body = "";
if (!empty($u_blank))
  	$body = "Cuentas con e-mail en blanco:\n" . implode("\n", $u_blank) . "\n";
if (!empty($u_error))
  	$body .= "Cuentas que dieron error al intentar obtener los datos:\n" . implode("\n", $u_error);

if (!empty($body)){
	//notifica al administrador de Fuendocu
  	$res=mail($email_fuendocu, "FDAdmin: problemas usuarios Fuendocu", $body);
  	if (!$res){
		$cad_log.='* No se ha podido enviar notificacion a '.$email_fuendocu."\n";
  	}else{
		$cad_log.='- Se ha notificado a '.$email_fuendocu."\n";
  	}
  	//notifica al administrador de SEMAF
  	$res=mail($email_error,"FDAdmin: problemas usuarios Fuendocu", $body);
  	if(!$res){
  		$cad_log.='* No se ha podido enviar notificacion a '.$email_error."\n";
  	}else{
  		$cad_log.='- Se ha notificado a '.$email_error."\n";
  	}
}
$cad_log.='- Fin script: '.date('Y-m-d H:i:s')."\n";
print $cad_log;

exit();

//-------------------------- FUNCIONES PAGINA -----------------------------------------

// Function used to do API calls
function action($action, $params){
	ob_start();
	AJXP_XMLWriter::$headerSent = false;
	AJXP_Controller::findActionAndApply("edit", array_merge(
	array(
	"secure_token" => AuthService::generateSecureToken(),
	"get_action"   => "edit",
	"sub_action"   => $action
	),
	$params
	), array());

	$jsonstr = ob_get_clean();

	// Check returned XML
	if (empty($jsonstr)){

		// user_set_lock returns nothing
		if ($action == "user_set_lock")
			return true;
		else
			return false;
	}
	$json = json_decode($jsonstr);

	return (is_object($json))? $json : false;
}

function updateUserData($login, $isadmin, $name="", $email="", $phone="", $residencia="", $cargo="")
{
	// Change account type to admin if needed and set real name, email and phone
	if (!action("post_json_role", array(
			"role_id" => "AJXP_USR_/$login",
			"json_data" => '{"FORMS":{"AJXP_REPO_SCOPE_ALL":{"core.conf":{"ROLE_PARAM_email":"' . $email . '","ROLE_PARAM_email_ajxptype":"string","ROLE_PARAM_avatar":"","ROLE_PARAM_avatar_ajxptype":"binary","ROLE_PARAM_avatar_original_binary":"","ROLE_PARAM_avatar_original_binary_ajxptype":"string","ROLE_PARAM_USER_DISPLAY_NAME":"' . $name . '","ROLE_PARAM_USER_DISPLAY_NAME_ajxptype":"string","ROLE_PARAM_lang":"","ROLE_PARAM_phone":"' . $phone . '","ROLE_PARAM_country":"","ROLE_PARAM_position":"'. $cargo . '","ROLE_PARAM_residence":"' . $residencia . '"}}},"ROLE":{"ACL":{"0":"r","1":"rw","ajxp_shared":"rw"},"ACTIONS":{},"PARAMETERS":{"AJXP_REPO_SCOPE_ALL":{"core.conf":{"email":"' . $email . '","avatar":"","USER_DISPLAY_NAME":"' . $name . '","lang":"","phone":"' . $phone . '","country":"","avatar_original_binary":"","position":"'. $cargo . '","residence":"' . $residencia . '"}}},"APPLIES":[]},"USER":{"LOCK":false,"DEFAULT_REPOSITORY":"","PROFILE":"' . ($isadmin? 'admin':'standard') . '","ROLES":[]}}'
					)))
						return function_error(-1, "No se puede actualizar la ACL o los datos del usuario $login");
						return true;
}

//notifica error en el demonio por email
function p_NotificarError($email_destino,$error_msg=''){
	//notifica error por email
	@ $rec=mail($email_destino,'ERROR demonio checkusers','No se ha ejecutado demonio checkusers.php a las '.date('Y-m-d H:i:s').': '.$error_msg);
	if($rec){
		print '->Error notificado por email a '.$email_destino."\n";
		return true;
	}else{
		print '* No se ha podido notificar error por email a '.$email_destino.' *'."\n";
		return false;
	}
}
?>